package com.lxk.concurrency.example.singleton;

import com.lxk.concurrency.annoations.ThreadSafe;

/**
 * @Description 懒汉模式，双重同步锁单例模式
 *
 * @author 堆堆堆
 * @date 2018年5月25日 下午3:23:15
 */
@ThreadSafe
public class SingletonExample5 {

	// 私有构造函数
	private SingletonExample5() {
	}

	// 创建一个 SingletonExample4 对象的过程
	// 1、memory = allocate() 分配对象的内存空间
	// 2、ctorInstance() 初始化对象
	// 3、instance = memory 设置 instance 指向刚分配的内存

	// 单例对象
	// 使用 volatile 限制指令重排
	private volatile static SingletonExample5 instance = null;

	// 静态的工厂方法
	public static SingletonExample5 getInstance() {

		if (instance == null) { // 双重检测机制 // B

			synchronized (SingletonExample5.class) {
				if (instance == null)
					instance = new SingletonExample5(); // A - 3
			}

		}

		return instance;
	}
}
